package com.ys.迭代器;

import java.util.ArrayList;
import java.util.Iterator;

/**
 * 描述:
 * * 1.List实现类的遍历方式
 *  *   a)普通for循环
 *  *   b)增强for循环
 *  *   c)使用迭代器来遍历
 *  * 2.Iterator迭代器的概述
 *  *   Iterator迭代器可以用于遍历List接口和Set接口的所有实现类，但是Map接口的实现类不能使用迭代器。
 *  * 3.如何获得迭代器
 *  *   List接口和Set接口的所有实现类，通过“public Iterator<E> iterator()”获得一个迭代器。
 *  *   注意：通过“iterator()”方法，获得的是一个Iterator接口的实现类对象。
 *  * 4.Iterator中的方法
 *  *   boolean hasNext();	判断集合中是否有下一个元素可以迭代，如果有则返回true，否则返回false。
 *  *   Object next();	    返回迭代的下一个元素，并把指针向后移动一位。
 *  *   void remove();	    将迭代器当前返回的元素删除（可选操作）。
 *  * 5.使用Iterator迭代器删除元素
 *  *   我们在迭代的过程中，不能通过List或Set接口提供的方法来删除元素，否则就会抛出“java.util.ConcurrentModificationException”异常。
 *  *   如果在迭代的过程中，我们需要删除List或Set实现类中的元素，那么必须通过Iterator提供的“remove()”方法来实现。
 *  * 6.Iterator迭代器和增强for循环的对比
 *  *   注意：for-each循环底层用的就是Iterator来实现的
 *  *  (1)for-each不但能遍历集合，还能遍历数组，但是Iterator只能遍历集合。
 *  *  (2)使用for-each遍历集合时不能删除元素，使用Iterator遍历集合时，还可以使用Iterator的remove方法删除元素。
 * @author CodeYang
 * @version 2020/12/26 11:18
 */
public class 迭代器使用 {

    public static void main(String[] args) {
        /**
         *  List 与 Set 接口的实现类都是 可以使用迭代器
         */
        ArrayList<String> arrayList = new ArrayList<>();
        arrayList.add("1");
        arrayList.add("2");
        arrayList.add("3");
        arrayList.add("4");

        Iterator<String> iterator = arrayList.iterator();
        while (iterator.hasNext()){
            String next = iterator.next();
            if ("2".equals(next)){
                // 可以在迭代过程中删除集合的元素
                // 在迭代过程中不能使用集合的操作方法改变集合内容,因为这样会使迭代器不知道游标的真实指向
                iterator.remove();
            }

        }
        for (String next: arrayList) {
            System.out.println(next);
        }

    }
}
